package com.lightningtrade.service.impl;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lightningtrade.domain.SysUser;
import com.lightningtrade.mapper.SysUserMapper;
import com.lightningtrade.service.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 用户管理服务实现类
 * 该类实现了用户注册、登录、信息更新、角色更新、用户注销、密码找回等操作。
 */
@Service
public class SysUserServiceImpl implements SysUserService {

    @Autowired
    private SysUserMapper sysUserMapper;

    /**
     * 用户注册
     * @param sysUser 用户信息
     * @return 返回注册操作的结果，成功返回 1，失败返回 0
     */
    @Override
    public int register(SysUser sysUser) {
        return sysUserMapper.insertUser(sysUser);  // 返回 1 表示成功，0 表示失败
    }

    /**
     * 更新用户信息
     * @param sysUser 用户信息
     * @return 返回更新操作的结果，成功返回 1，失败返回 0
     */
    @Override
    public int updateUserInfo(SysUser sysUser) {
        return sysUserMapper.updateUser(sysUser);  // 返回 1 表示更新成功，0 表示更新失败
    }

    /**
     * 更新用户角色
     * @param uid 用户ID
     * @param role 新角色
     * @return 返回更新操作的结果，成功返回 1，失败返回 0
     */
    @Override
    public int updateUserRole(Integer uid, String role) {
        try {
            // 检查role字符串是否符合JSON数组格式
            ObjectMapper objectMapper = new ObjectMapper();
            List<String> roleList = objectMapper.readValue(role, new TypeReference<List<String>>() {});

            // 验证角色是否合法，例如必须是 "admin" 或 "user" 或 "seller"
            for (String r : roleList) {
                if (!isValidRole(r)) {
                    throw new IllegalArgumentException("无效的角色: " + r);
                }
            }
            // 如果格式正确且角色有效，调用 mapper 更新角色
            return sysUserMapper.updateUserRole(uid, role);  // 返回 1 表示更新成功，0 表示更新失败
        } catch (Exception e) {
            // 捕获所有异常并抛出错误，确保格式不正确时能捕获到
            throw new IllegalArgumentException("角色格式不正确或无法解析: " + role, e);
        }
    }

    // 检查角色是否合法
    private boolean isValidRole(String role) {
        // 在这里根据需求检查角色是否合法，例如只允许 "admin" 和 "user"
        return role.equals("admin") || role.equals("user") || role.equals("seller");
    }

    /**
     * 注销用户
     * @param uid 用户ID
     * @return 返回注销操作的结果，成功返回 1，失败返回 0
     */
    @Override
    public int deleteUser(Integer uid) {
        return sysUserMapper.deleteUser(uid);  // 返回 1 表示删除成功，0 表示删除失败
    }

    /**
     * 修改密码
     * @param phone 用户手机
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 返回密码更新操作的结果，成功返回 1，失败返回 0
     */
    @Override
    public int recoverPassword(String phone, String oldPassword, String newPassword) {
        // 转码
        oldPassword = new BCryptPasswordEncoder().encode(oldPassword);
        newPassword = new BCryptPasswordEncoder().encode(newPassword);
        return sysUserMapper.updatePasswordByEmail(phone, oldPassword ,newPassword);  // 返回 1 表示密码更新成功，0 表示更新失败
    }

    @Override
    public SysUser getUserByUid(String uid) {
        return sysUserMapper.getUserByUid(uid);
    }
}
